﻿// 下⾯演⽰⼀个经典问题，两个线程交替打印奇数和偶数
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable
using namespace std;


int main()
{
	mutex mtx;
	condition_variable cv;
	int n = 100;
	bool flag = true;
	// 第⼀个打印的是t1打印0
	thread t1([&]() {
		int i = 0;
		while (i < n)
		{
			unique_lock<mutex> lock(mtx);
			// flag == false t1⼀直阻塞
			// flag == true t1不会阻塞
			while (!flag)
			{
				cv.wait(lock);
			}
			cout << i << endl;
			flag = false;
			i += 2; // 偶数
			cv.notify_one();
		}
		});
	//this_thread::sleep_for(chrono::milliseconds(3000));
	thread t2([&]() {
		int j = 1;
		while (j < n)
		{
			unique_lock<mutex> lock(mtx);
			// 只要flag == true t2⼀直阻塞
			// 只要flag == false t2不会阻塞
			while (flag)
				cv.wait(lock);
			cout << j << endl;
			j += 2; // 奇数
			flag = true;
			cv.notify_one();
		}
		});
	t1.join();
	t2.join();
	return 0;
}